home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Everything For A Hacker
/
19990506-[HACK].iso
/
HEXEDIT
/
UTILS
/
80X0393.ARJ
/
RAND.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-03-30
|
3KB
|
79 lines
comment |
rand.asm
public domain, linear congruential pseudo-random
number generator routine by Jerry Coffin.
These do have a bit of a defect - there's one bit that actually
is predictable - the two rotates at the end of rand bury it in
the middle of the number instead of the end where it causes
numbers to alternate between odd and even. As is, in binary you
can still see the alternation, but when converted to decimal, it
generally isn't too obvious. An alternative is to use a 32 bit
generator and only use 16 bits of what it produces. With 16 bit
registers, this is quite a bit more work, and for light duty use,
this one seems to be adequate. For serious statistical analysis,
you should probably investigate other algorithms.
srand should be called before rand is used, but needs only to be
called once at the beginning of the program. It uses the seconds
and hundredths of a second read from DOS to seed the generator
which is relatively random due to the imprecision of the clock,
but as noted above, it's likely not particularly good for serious
statistical analysis but seems to work fine for games and such.
Assemble with a definition to tell it what memory model to use, as in:
tasm /Dmemmodel=small /mx rand
As is, these will assemble to produce names that a c compiler
will recognize (lower case with an underscore before the
function name.) If you wish to call from BASIC, Pascal, etc.
change the language on the model line to suit...
|
%.model memmodel,c
.data
k1 dw 9821
k2 dw 1
;
; These two values are relatively critical to the quality of
; number generated. They were picked in accordance with Knuth
; Vol. 2, which you should likely read youself if you want to
; modify this or produce another of your own...
;
seed dw ?
.code
public rand
rand proc
;
; returns a 16 bit semi-poor quality pseudo-random number in AX.
;
; destroys AX and DX.
;
mov ax,seed
imul k1
add ax,k2
mov seed,ax
ror al,1
rol ah,1
ret
rand endp
public srand
srand proc
;
; Seeds rand from the DOS clock.
;
mov ah,2ch
int 21h
mov seed,dx
ret
srand endp
end